package com.itany.corejava.code07_面向对象.封装;

/**
 * @author: 石小俊
 * @date: 2023年03月07日 17:01
 * @version: 1.0
 */
public class Poker {

    private Card[] cards;

    public Card[] getCards() {
        return cards;
    }

    public void setCards(Card[] cards) {
        this.cards = cards;
    }

    // 定义Poker的构造方法,为一副牌填充正确的54张牌
    public Poker() {
        cards = new Card[54];
        // 定义每一张牌可能的花色与点数,不考虑大小王
        // 花色共有四种
        String[] colors = {"黑桃", "红桃", "梅花", "方块"};
        // 点数为A-K
        String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        // 通过双重for循环,为每一张牌设置值
        // 每一种花色都需要与一种点数进行组合
        // 定义一个cards初始的下标,下标从0开始
        int index = 0;
        // 外层循环,控制花色
        for (int i = 0; i < colors.length; i++) {
            // 内层循环,控制点数
            for (int j = 0; j < nums.length; j++) {
                cards[index++] = new Card(colors[i], nums[j]);
            }
        }
        // 除此以外,还有大小王
        cards[index++] = new Card("大", "王");
        cards[index++] = new Card("小", "王");
    }

    // 洗牌,将牌的顺序打乱后展示
    public Card[] shuffle() {
        // 定义一个相同长度,相同类型的数组,用于存放洗牌后的数据
        Card[] cards = new Card[54];
        // 为新的数组进行赋值,其值取自未洗牌的数据
        for (int i = 0; i < cards.length; i++) {
            // 随机获取未洗牌前的某一张牌
            // 获取随机下标的元素值,下标范围:0-53
            int index = (int) (Math.random() * 54);
            // 从未洗牌的数据中取出对应下标的Card
            Card card = this.cards[index];

            // 赋值前先判断对应下标的元素是否有值
            while (card == null) {
                // 如果发现没有值,说明已经使用过被清除了
                // 重新随机获取一张牌
                index = (int) (Math.random() * 54);
                card = this.cards[index];
            }

            // 如果取出的牌不为空,则将取出来的Card赋值给新的数组
            cards[i] = card;
            // 将已赋值的原数组的元素值清除
            this.cards[index] = null;
        }
        return cards;
    }
}
